import { _decorator, animation, Component, Node, Prefab, ProgressBar, v3, Vec3 } from 'cc';
import { ShiBingDt } from '../../../FrameWork3.8.6/FrameWork/Common/CommonInterface';
import { AnimationControl } from '../Control/AnimationControl';
import { ShiBingLayer } from '../ModuleLayer/ShiBingLayer';
import { EnemyDtMgr, ShiBingDtMgr } from '../../../FrameWork3.8.6/FrameWork/Data/DataBaseMgr';
import { CharacterBase } from './CharacterBase';
import { FlyObjectLayer } from '../ModuleLayer/FlyObjectLayer';
import { ModuleMgr } from '../../../FrameWork3.8.6/FrameWork/Module/ModuleMgr';
const { ccclass, property } = _decorator;

@ccclass('ShiBingBase')
//这是兵种的基类，所有兵种的脚本都需要继承这个
export class ShiBingBase extends Component {
    protected _name:string="";//唯一标识与其他同种类士兵不同的名字
    get name(){
        return this._name;
    }
    //都是士兵数据
    protected _shiBingDt:ShiBingDt=null;
    get shiBingDt(){
        return this._shiBingDt;
    }
    //士兵血条UI
    protected _Hpbar:ProgressBar=null;

    //士兵总共血条数值
    protected _totalHp:number=0;
    //士兵当前血条数值
    protected _curHp:number=0;
    //最终目的地
    protected _endPos:Vec3=v3();

    protected _animationCtrl:AnimationControl=null;

    //前进方向
    protected _dirX:number=0;//1为向右，-1为向左
    get dirX(){
        return this._dirX;
    }
    //攻击范围内敌方士兵数组
    protected _arrEnemy:Node[]=[];

    //士兵层
    protected _shiBingLayer:ShiBingLayer=null;
    //飞行物模块层
    protected _flyObjectLayer:FlyObjectLayer=null;
    onInit(shiBingDt:ShiBingDt,endPos:Vec3,dirX:number,name:string){
        this._name=name;
        //初始化动画
        this._animationCtrl=this.node.addComponent(AnimationControl);
        //初始化当前兵种数据
        this._shiBingDt=shiBingDt;
        //初始化终点
        this._endPos=endPos;
        //初始化前进方向
        this._dirX=dirX;
        //初始化血条UI
        this._Hpbar=this.node.getChildByName("_Hp").getComponent(ProgressBar);
        this._Hpbar.progress=1;
        //初始化血条数值
        this._totalHp=shiBingDt.hp;
        this._curHp=this._totalHp;
        //初始化士兵层
        this._shiBingLayer=this.node.parent.parent.getComponent(ShiBingLayer);

        //初始化飞行物模块层
        this._flyObjectLayer=ModuleMgr.instance.getModule<FlyObjectLayer>("FlyObjectLayer");
    }

    //士兵有四种状态，走路，攻击，受伤，死亡
    walk(){
        this._animationCtrl.playState(this._shiBingDt.prefabName+"Walk");
    }

    attack(){
        this._animationCtrl.playState(this._shiBingDt.prefabName+"Attack");
        this.attackFrame();
    }

    //攻击帧动画,帧动画方法
    attackFrame(){
        //盾兵枪兵，无需重写该方法
        //弓兵重写该方法
        //这里应该有自己的帧动画，在攻击一瞬间对敌人进行判定是否击中
        //调用目标的掉血方法
        //需要判断是士兵还是CharacterBase
        let target=this.getNearestCamp();
        if(!target){
            return;
        }
        let CharacterBaseTs=target.getComponent(CharacterBase);
        if(CharacterBaseTs){
            CharacterBaseTs.hurt(this.shiBingDt.ack);
        }
        else{
            let shibingbase=target.getComponent(ShiBingBase)
            if(shibingbase){
                shibingbase.hurt(this.shiBingDt.ack);
            }
            
        }
    }

    hurt(damage:number){
        //先播放受伤动画
        this._animationCtrl.playState(this._shiBingDt.prefabName+"Hurt");
        //血条只有在玩家受伤时才会出现0.5秒，展示血条扣血
        this._curHp-=damage;
        if(this._curHp>0){
            this._Hpbar.progress=this._curHp/this._totalHp;
            this._Hpbar.node.active=true;
            this.scheduleOnce(()=>{
                this._Hpbar.node.active=false;
            },0.5)
            return;
        }
        //当兵种血条<=0时，触发死亡
        this.death();
    }

    death(){
        this._animationCtrl.playState(this._shiBingDt.prefabName+"Death");
        this._Hpbar.node.active=false;
        //播放死亡音乐
        //呼叫ShiBingLayer的回收方法
        this._shiBingLayer.deleteShiBing(this);
        
    }



    onUpdate(dt:number){
        
        //判断攻击范围是否有敌人
        this.searchEnemy();
        if(this._arrEnemy.length){
            let target=this.getNearestCamp();
            if(!target){
                return;
            }
            this.attack();
            return;
        }
        //当前范围没有敌人，兵种向endPos的x前进,播放移动动画
        this.walk();
        //对临界值的判断无法出界
        if(this._dirX>0){
            if(this.node.position.x>=this._endPos.x){
                this.node.setPosition(v3(this._endPos.x,this.node.position.y));
                return;
            }
            let moveX=dt*this.shiBingDt.speed*this._dirX;
            this.node.setPosition(v3(this.node.position.x+moveX,this.node.position.y));
        }
        else{
            if(this.node.position.x<=this._endPos.x){
                this.node.setPosition(v3(this._endPos.x,this.node.position.y));
                return;
            }
            let moveX=dt*this.shiBingDt.speed*this._dirX;
            this.node.setPosition(v3(this.node.position.x+moveX,this.node.position.y));
        }
        

    }


    //搜寻当前范围有没有敌人
    searchEnemy(){
        let endPosX=this.node.position.x+this._dirX*this.shiBingDt.ackRange;
        if(this._dirX>0){
            //这里只判断是否有敌人士兵，还需要判断是否有Boss
            this._arrEnemy=this._shiBingLayer.getCamp(this.node.position.x,endPosX,this.shiBingDt.camp);
        }
        else{
            this._arrEnemy=this._shiBingLayer.getCamp(endPosX,this.node.position.x,this.shiBingDt.camp);
        }
    }

    //获取敌方阵营中距离自己最近的一个单位
    getNearestCamp(){
        let nearEnemy:Node=null;
        let dis:number=10000;//nearEnemy距离这个节点的距离
        for(let enemy of this._arrEnemy){
            let distance=Math.abs(enemy.position.x-this.node.position.x);
            if(distance<dis){
                dis=distance;
                nearEnemy=enemy;
            }
        }
        return nearEnemy;
    }
}


